﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using CondominiosREST.Dominio;
using CondominiosREST.Persistencia;

namespace CondominiosREST
{
    public class Residentes : IResidentes
    {
        private ResidenteDAO residenteDAO = null;

        private ResidenteDAO ResidenteDAO
        {
            get
            {
                if (residenteDAO == null)
                    residenteDAO = new ResidenteDAO();
                return residenteDAO;
            }
        }

        public RResidente CrearResidente(RResidente dresidente)
        {
            // Validación de DNI obligatorio
            if (null == dresidente.DNI || String.Empty.Equals(dresidente.DNI))
                throw new Exception("No se puede registrar un Residente sin DNI");
            //throw new ArgumentNullException("No se puede registrar un Residente sin DNI");

            // Validación de longitud de DNI = 8
            if (dresidente.DNI.Length != 8)
                throw new Exception("El DNI debe tener 8 posiciones");

            // Validación de existencia de un residente con el mismo DNI
            if (ResidenteDAO.Obtener(dresidente.DNI) != null)
                throw new Exception("Ya existe un Residente con el DNI indicado");

            // Validación de existencia de un residente con el mismo Correo
            if (ResidenteDAO.BuscarCorreo(dresidente.Correo).Count > 0)
                throw new Exception("Ya existe un Residente con el Correo indicado");

            if (null == dresidente.Tipo || String.Empty.Equals(dresidente.Tipo))
                throw new Exception("No se puede registrar un residente sin el Tipo");

            // Validación de edad aceptable
            if (dresidente.Edad < 18)
                throw new Exception("Para poder registrarse debe ser mayor de edad");

            RResidente residenteACrear = new RResidente()
            {
                DNI = dresidente.DNI,
                Nombres = dresidente.Nombres,
                ApellidoPaterno = dresidente.ApellidoPaterno,
                ApellidoMaterno = dresidente.ApellidoMaterno,
                Edad = dresidente.Edad,
                Correo = dresidente.Correo,
                Clave = dresidente.Clave,
                Tipo = dresidente.Tipo
            };

            return ResidenteDAO.Crear(residenteACrear);
        }

        public RResidente ObtenerResidente(string dni)
        {
            return ResidenteDAO.Obtener(dni);
        }

        public RResidente ModificarResidente(RResidente dresidente)
        {
            RResidente residenteAModificar = new RResidente()
            {
                DNI = dresidente.DNI,
                Nombres = dresidente.Nombres,
                ApellidoPaterno = dresidente.ApellidoPaterno,
                ApellidoMaterno = dresidente.ApellidoMaterno,
                Edad = dresidente.Edad,
                Correo = dresidente.Correo,
                Clave = dresidente.Clave,
                Tipo = dresidente.Tipo
            };

            return ResidenteDAO.Modificar(residenteAModificar);
        }

        public void EliminarResidente(RResidente residente)
        {
            ResidenteDAO.Eliminar(residente);
        }

        public ICollection<RResidente> ListarTodosLosResidentes()
        {
            return ResidenteDAO.ListarTodos();
        }
    }
}
